package com.maochang.top.cglib.service.impl;


import com.maochang.top.cglib.service.UserService;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class UserServiceCglibProxy {
    public  static UserService createUserServiceCglibProxy(Class clazz){
        //1.创建了一个动态的字节码
        Enhancer enhancer=new Enhancer();
        //2.定义当前代理出来的类的父类
        enhancer.setSuperclass(clazz);
        //3.设置回调
        enhancer.setCallback(new MethodInterceptor() {
            /**
             *
             * @param o    代理出来的那个类的对象
             * @param method  原始调用方法
             * @param objects  调用参数
             * @param methodProxy 代理方法(代理出来的那个类里边的save方法)
             * @return
             * @throws Throwable
             */
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                //System.out.println(o.getClass());
                //method.invoke(o,objects);  没有原始对象 所以不是这个
                //methodProxy.invoke(o,objects);
                Object  o1=methodProxy.invokeSuper(o,objects);//代理对象要调用父类的方法--完成对原始功能的调用
                if(method.getName().equals("save")){
                    System.out.println("后置增强1");
                    System.out.println("后置增强2");
                }
                return o1;
            }
        });
        UserService userService=(UserService) enhancer.create();
        return  userService;
    }
}
